﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TemplateWeb.Helpers;
using TemplateWeb.Models;
using System.Collections;
using System.Net;
using System.IO;
using System.Data.Objects;
using System.Web.Security;

namespace TemplateWeb.Controllers
{
    [HandleError]
    public class HomeController : BaseController
    {
        public ActionResult Index()
        {
            var data = new DataTransferViewModel
            {
                EnumViewModelType = EnumViewModel.HOME_INDEX
            };
            ValidateAuthentication();
            return View(CreateViewModel(data));
        }

        public void ValidateAuthentication()
        {
            WebConfiguration.ArrWhether = HtmlHelpers.RetrieveWhether();
            // Checking user is exist login
            var username = string.Empty;
            WebConfiguration.IsRequestAuthentication = ReviewCookieMember(ref username);
            WebConfiguration.UserNameAuthentication = username;
            WebConfiguration.AllowAccessAdminCP = false;
            if (WebConfiguration.IsRequestAuthentication)
            {
                // Checking if role of user is admin
                var role = _repSLM_Members.SelectByUserName(username).SLM_Groups.FirstOrDefault(p => p.GroupId == 5 || p.GroupId == 6);
                if (role != null)
                {
                    WebConfiguration.AllowAccessAdminCP = true;
                }
            }
        }

        private bool ReviewCookieMember(ref string username)
        {
            var flag = false;
            HttpCookie SlmMemberCookie = new HttpCookie("SLMFMembers");
            SlmMemberCookie = Request.Cookies["SLMFMembers"];
            if (SlmMemberCookie != null && SlmMemberCookie.Value != "" &&
                 SlmMemberCookie.Value != null)
            {
                username = SlmMemberCookie.Value.ToString();
                flag = true;
            }
            return flag;
        }

        private void SetCookieMember(string username, string password, bool rememberme = true)
        {
            HttpCookie SlmMemberCookie = new HttpCookie("SLMFMembers");
            HttpCookie SlmSessionId = new HttpCookie("SLMFSessionId");
            DateTime dateSLMF = DateTime.Now;
            SlmMemberCookie.Value = username;
            SlmMemberCookie.Expires = dateSLMF.AddDays(3);
            SlmSessionId.Value = password;
            SlmSessionId.Expires = dateSLMF.AddDays(4);
            if (rememberme)
            {
                SlmMemberCookie.Expires = dateSLMF.AddDays(7);
                SlmSessionId.Expires = dateSLMF.AddDays(8);
            }
            Response.Cookies.Add(SlmMemberCookie);
            Response.Cookies.Add(SlmSessionId);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult LogOnHome(FormCollection forms)
        {
            var errText = string.Empty;
            string username = forms.GetValues("LogOn_UserName")[0];
            string password = forms.GetValues("LogOn_Password")[0];

            ObjectParameter parpassword = new ObjectParameter("Password", typeof(string));
            ObjectParameter parsalt = new ObjectParameter("Salt", typeof(string));
            ObjectParameter parresult = new ObjectParameter("Result", typeof(int));
            var intResult = DataContext.Instance.selMembersLogin(username, parpassword, parsalt, parresult);
            if (intResult == -1)
            {
                errText = "Tài khoản này không tồn tại. Bạn có thể Đăng ký một Tài khỏan mới";
            }
            else if (intResult == -2)
            {
                errText = "Hệ thống hiện nay chưa cho phép đăng nhập vào diễn đàn.";
            }
            else if (intResult == -3)
            {
                errText = "Tài khoản của bạn đã bị khóa. Bạn không được phép đăng nhập vào diễn đàn.";
            }
            else if (intResult == -5)
            {
                errText = "Tài khoản của bạn chưa kích hoạt. Email kích hoạt Tài khoản đã được gửi đến Email bạn dùng đăng ký.";
            }
            else if (intResult == -4)
            {
                errText = "Tài khoản của bạn cần chờ duyệt trước khi đăng nhập vào diễn đàn.";
            }

            if (errText == string.Empty)
            {
                UtiHashMd5 md5 = new UtiHashMd5();
                // First hash password which user input
                password = md5.Md5Encode(password);
                // Then continue hash on above hashed password
                string strMd5Server = md5.Md5Encode(password + parsalt.Value);
                if (strMd5Server != parpassword.Value.ToString())
                {
                    // Store data to transfer to view
                    ViewData["LoginStatus_Home"] = "Mật khẩu của thành viên này chưa đúng. Bạn cần kiểm tra lại.";
                    ViewData["Flag"] = false;
                    WebConfiguration.AllowAccessAdminCP = false;
                }
                else
                {
                    ViewData["Flag"] = true;
                    ViewData["UserName"] = username;
                    // Checking if role of user is admin
                    var role = _repSLM_Members.SelectByUserName(username).SLM_Groups.FirstOrDefault(p => p.GroupId == 5 || p.GroupId == 6);
                    SetCookieMember(username, strMd5Server);
                    if (role != null)
                    {
                        WebConfiguration.AllowAccessAdminCP = true;
                    }
                }
            }
            else
            {
                // Store data to transfer to view
                ViewData["LoginStatus_Home"] = errText;
                ViewData["Flag"] = false;
                WebConfiguration.AllowAccessAdminCP = false;
            }
            var data = new DataTransferViewModel
            {
                EnumViewModelType = EnumViewModel.HOME_INDEX
            };
            ViewData["Whether"] = HtmlHelpers.RetrieveWhether();
            ValidateAuthentication();
            return View("Index", CreateViewModel(data));
        }

        public ActionResult LogOffHome()
        {
            HttpCookie SlmMemberCookie = new HttpCookie("SLMFMembers");
            SlmMemberCookie = Request.Cookies["SLMFMembers"];
            if (SlmMemberCookie != null && SlmMemberCookie.Value != "" &&
                     SlmMemberCookie.Value != null)
            {
                SlmMemberCookie.Expires = new System.DateTime(2005, 1, 1);
                SlmMemberCookie.Value = null;
                Response.Cookies.Add(SlmMemberCookie);
            }
            FormsAuthentication.SignOut();

            var data = new DataTransferViewModel
            {
                EnumViewModelType = EnumViewModel.HOME_INDEX
            };
            ViewData["Whether"] = HtmlHelpers.RetrieveWhether();
            ValidateAuthentication();
            return View("Index", CreateViewModel(data));
        }

        public ActionResult GioiThieu()
        {
            var data = new DataTransferViewModel
            {
                EnumViewModelType = EnumViewModel.HOME_GIOITHIEU
            };
            ValidateAuthentication();
            return View(CreateViewModel(data));
        }

        public ActionResult DanhSachThanhVien()
        {
            var data = new DataTransferViewModel
            {
                EnumViewModelType = EnumViewModel.HOME_DANHSACHTHANHVIEN
            };
            ValidateAuthentication();
            return View(CreateViewModel(data));
        }

        public ActionResult ChiTietCongTy(int id)
        {
            var data = new DataTransferViewModel
            {
                EnumViewModelType = EnumViewModel.HOME_CHITIETCONGTY,
                IntID = id
            };
            ValidateAuthentication();
            return View(CreateViewModel(data));
        }

        public ActionResult PhapLy()
        {
            var data = new DataTransferViewModel
            {
                EnumViewModelType = EnumViewModel.HOME_PHAPLY
            };
            ValidateAuthentication();
            return View(CreateViewModel(data));
        }

        public ActionResult ChiTietPhapLy(int id)
        {
            var data = new DataTransferViewModel
            {
                EnumViewModelType = EnumViewModel.HOME_CHITIETPHAPLY,
                IntID = id
            };
            ValidateAuthentication();
            return View(CreateViewModel(data));
        }

        public ActionResult HoiDap()
        {
            var data = new DataTransferViewModel
            {
                EnumViewModelType = EnumViewModel.HOME_HOIDAP
            };
            ValidateAuthentication();
            ViewData["HoiDap"] = null;
            return View(CreateViewModel(data));
        }

        [ValidateInput(false)]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult InsertHoiDap(FormCollection forms)
        {
            string hoten = forms.GetValues("HopThu_HoTen")[0];
            string email = forms.GetValues("HopThu_Email")[0];
            string tieude = forms.GetValues("HopThu_TieuDe")[0];
            string noidung = forms.GetValues("HopThu_NoiDung")[0];

            var newItem = new GopY
            {
                Email = email,
                TieuDe = tieude,
                NoiDung = noidung,
                NgayGopY = DateTime.Now
            };
            var result = _repGopY.Insert(newItem);
            var data = new DataTransferViewModel
            {
                EnumViewModelType = EnumViewModel.HOME_HOIDAP
            };
            ViewData["HoiDap"] = result ? "Thư của bạn đã được gửi đi, sau khi xem xét chúng tôi sẽ gửi phản hồi cho bạn!" : "Thư của bạn chưa được gửi đi, có lỗi sảy ra trong quá trình gửi câu hỏi.";
            ValidateAuthentication();
            return View("HoiDap", CreateViewModel(data));
        }

        public ActionResult LoaiHinhThamDinhGia(int id)
        {
            var data = new DataTransferViewModel
            {
                EnumViewModelType = EnumViewModel.HOME_LOAIHINHTHAMDINHGIA,
                IntID = id
            };
            ValidateAuthentication();
            return View(CreateViewModel(data));
        }

        public ActionResult DienDan()
        {
            return View("../Home/Forum");
        }

        public PhapLyResult DownloadPhapLy(string filename)
        {
            return new PhapLyResult
            {
                FileName = filename,
                Path = "/Content/Images/Items/" + filename
            };
        }
    }
}
